#include <iostream>
#include <memory>
#include <unistd.h>
#include "Protocol.hpp"
#include "TcpServer.hpp"
#include "Calculate.hpp"
#include "Daemon.hpp"

using namespace Net_Work;
using namespace Protocol;
using namespace CalculateNS;
using namespace std;

// 处理报文的方法
string HandlerRequest(string &inbufferstream, bool *error_code)
{
    *error_code = true;
    // 0. 计算器对象
    Calculate calculate;
    // 1. 构建响应对象
    std::unique_ptr<Factory> factory = std::make_unique<Factory>();
    auto req = factory->BuildRequest();

    // 2. 分析字节流，看是否有一个完整的报文
    string total_resp_string;
    string message;
    while (Decode(inbufferstream, &message))
    {
        // 3. 这里一定读到了一个完整的报文，可以进行反序列化
        if (!req->deserialize(message))
        {
            // 非法请求
            *error_code = false;
            return string();
        }
        // 4. 业务处理
        auto resp = calculate.Cal(req);
        // 5. 序列化response
        string send_string;
        resp->serialize(&send_string);
        // 6. 构建完整的字符串级别的响应报文
        send_string = Encode(send_string);
        // 7. 发送
        total_resp_string += send_string;
    }
    return total_resp_string;
}

// ./server port
int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        cout << "Usage: " << argv[0] << "port" << endl;
        return 0;
    }

    uint16_t localport = std::stoi(argv[1]);
    Daemon(false, false);
    std::unique_ptr<TcpServer> svr(new TcpServer(localport, HandlerRequest));
    svr->Loop();
}